#include <iostream>  // 引入输入输出流库
#include <string>    // 引入字符串库

/*
在C++中，类的成员变量和成员函数的存储位置有所区别。具体规则如下：
    非静态成员变量：属于类的每个对象。每个对象都包含自己的一份非静态成员变量的存储空间。
    静态成员变量：不属于类的对象，而是属于类本身。所有对象共享同一个静态成员变量，静态成员变量在类的全局静态存储区中分配空间。
    成员函数：无论是非静态成员函数还是静态成员函数，都是类的一部分，存储在代码段中，并不占用对象的存储空间。
*/

using namespace std;  // 使用标准命名空间

// 定义一个 stu 类
class stu
{
private:
    // 没有定义私有成员

public:
    //int i0;
    // 定义了三个静态成员变量
    static int i1;  // 静态整数 i1
    static int i2;  // 静态整数 i2
    static int i3;  // 静态整数 i3

    // 定义了三个成员函数
    void func_1() 
    {
        // 空函数体，未实现
        cout << "我是func_1" << endl;
    }
    
    void func_2() 
    {
        // 空函数体，未实现
        cout << "我是func_2" << endl;
    }
    
    void func_3() 
    {
        // 空函数体，未实现
        cout << "我是func_3" << endl;
    }
};

// 静态成员变量必须在类外定义
int stu::i1 = 0;  // 初始化静态成员 i1
int stu::i2 = 0;  // 初始化静态成员 i2
int stu::i3 = 0;  // 初始化静态成员 i3

int main(int argc, char const *argv[])
{
    cout << sizeof(stu) << "字节" << endl;  // 输出 "sizeof(stu)" 和 "字节"
    
    stu s1;  // 创建一个 stu 类型的对象 s1
    stu s2;  // 创建一个 stu 类型的对象 s2
    s2.func_1();  // 调用 s2 对象的 func_1() 函数

    s2.i1 = 90;  // 修改静态成员 i1 的值为 90
    cout << s1.i1 << endl;  // 输出静态成员 i1 的值，值应该为 90，因为静态成员是共享的

    return 0;  // 程序正常结束
}
